package com.xjm.aop;
import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.*;
import org.aspectj.lang.reflect.MethodSignature;
import org.springframework.core.annotation.Order;
import org.springframework.stereotype.Component;

import java.time.Duration;
import java.time.LocalDateTime;
import java.util.logging.Logger;

/**
 * @author jaymin. <br>
 * 系统基础切面，主要用于研究AOP.
 * 2021/2/12 20:56
 */
@Aspect
@Order(2)
//@Component
public class HelloServiceAspect {

	private static final Logger log = Logger.getGlobal();

    /**
     * 使用常量统一管理切入点
     */
    public static final String POINT_CUT = "helloServicePointCut()";

    /**
     * <p>pointcut可以使用表达式来指定切入点.
     * <p>execution中的内容即为表达式.</p>
     * <p>* com.tea..service..*.*(..)</p>
     * <p>表示,拦截com.tea包下的service包中的所有类的所有方法(包括任意参数)
     */
    @Pointcut("execution(* com.xjm..service.impl.HelloServiceImpl.*(..))")
    public void helloServicePointCut() {
    }

    /**
     * 在方法执行前进行切入
     * @param joinPoint
     */
    @Before(POINT_CUT)
    public void before(JoinPoint joinPoint) {

    	log.info("before method execute ");
    }

    /**
     * 在方法返回值后进行切入
     * @param joinPoint
     * @param result
     */
    @AfterReturning(pointcut = POINT_CUT, returning = "result")
    public void afterReturning(JoinPoint joinPoint, Object result) {

    	log.info("method return");
    }


    /**
     * 获取连接点方法名
     * @param joinPoint
     * @return
     */
    public String getMethodName(JoinPoint joinPoint) {
        return ((MethodSignature) joinPoint.getSignature()).getMethod().getName();
    }

    /**
     * 在方法执行后进行切入
     * @param joinPoint
     */
    @After(POINT_CUT)
    public void after(JoinPoint joinPoint) {
    	log.info("after method execute");
    }
}
